﻿// 102_sdl_rgb.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <sdl/SDL.h>

using namespace std;
#pragma comment(lib, "SDL2.lib")
#undef main
int main(int argc, char* argv[])
{
    int w = 800;
    int h = 600;
    //1 初始化SDL video库
    if (SDL_Init(SDL_INIT_VIDEO))
    {
        cout << SDL_GetError() << endl;
        return -1;
    }
    //2 生成SDL窗口
    auto screen = SDL_CreateWindow(
        "test sdl ffmpeg",
        SDL_WINDOWPOS_CENTERED, //设置窗口位置居中
        SDL_WINDOWPOS_CENTERED,
        w,h,
        SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE
        );
    
    if(!screen)
    { 
        cout << SDL_GetError() << endl;
        return -2;
    }

    //3 生成渲染器
    auto render = SDL_CreateRenderer(screen, -1, SDL_RENDERER_ACCELERATED);
    if (!render)
    {
        cout << SDL_GetError() << endl;
        return -3;
    }

    //4 生成材质
    auto texture = SDL_CreateTexture(render,
        SDL_PIXELFORMAT_ARGB8888, // 4个字节，包含透明度
        SDL_TEXTUREACCESS_STREAMING, // 可加锁
        w, h
    );
    if (!texture)
    {
        cout << SDL_GetError() << endl;
        return -4;
    }


    

    //5 存放图像的数据 智能指针
    shared_ptr<unsigned char> rgb(new unsigned char[w * h * 4]);
    auto r = rgb.get();

    unsigned char tmp = 255;
    for (;;)
    {
        //添加退出事件
        SDL_Event ev;
        SDL_WaitEventTimeout(&ev, 10);
        if (ev.type == SDL_QUIT)
        {
            SDL_DestroyWindow(screen);
            break;
        }

        tmp--;

        for (int j = 0; j < h; j++)
        {
            int b = j * w * 4;
            for (int i = 0; i < w * 4; i += 4)
            {
                r[b + i] = 0;   //B
                r[b + i + 1] = 0; //G
                r[b + i + 2] = tmp; //R
                r[b + i + 3] = 0; //A
            }
        }

        //6 内存数据写入材质
        // texture 材质 
        // NULL表示图像全部取，图像不做截取
        // r代表图像
        // w*4 表示要取的数据，每一行的字节数
        SDL_UpdateTexture(texture, NULL, r, w * 4);

        //7 清理屏幕
        SDL_RenderClear(render);
        SDL_Rect sdl_rect;
        sdl_rect.x = 0;
        sdl_rect.y = 0;
        sdl_rect.w = w;
        sdl_rect.h = h;

        //8 复制材质到渲染
        SDL_RenderCopy(render, texture,
            NULL, //原图位置和尺寸
            &sdl_rect //目标位置和尺寸
        );

        //9 渲染
        SDL_RenderPresent(render);

        // ------
        //for(;;)
    }
    

    getchar();
    return 0;
}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
